home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_08 / treu / bgigrh.c < prev    next >
C/C++ Source or Header  |  1994-04-25  |  4KB  |  167 lines

  1. /******************************************************
  2.  * BGIGRH.C - required graphics functions
  3.  *  using Borland Graphic Interface
  4.  *
  5.  * The routines in this module adapt themselves to
  6.  * whatever video hardware a driver is available for.
  7.  *
  8.  * for TurboC V2.0
  9.  *
  10.  * by Anton Treuenfels
  11.  *
  12.  * first created:  01/01/93
  13.  * last revision:  04/11/94
  14.  *****************************************************/
  15.  
  16. /*****************************
  17.  * Header Section - BGIGRH.H *
  18.  *****************************/
  19.  
  20. #ifndef SEEN_BGIGRH
  21. #define SEEN_BGIGRH
  22.  
  23. /* exported variables */
  24.  
  25. extern long MaxXPos, MaxYPos;
  26. extern int MaxColor;
  27.  
  28. /* function prototypes */
  29.  
  30. void abspoint(int *, int *);
  31. void grhopen(void);
  32. void grhclose(void);
  33. void grhfpair(int, int, int, int);
  34. void grhrect(int, int, int, int);
  35. void grhcircle(int, int, int, int);
  36.  
  37. #endif
  38.  
  39. /***************************
  40.  * Code Section - BGIGRH.C *
  41.  ***************************/
  42.  
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <graphics.h>
  46.  
  47. #include "usrdef.h"
  48.  
  49. /* change the following definition if the driver
  50.    files are not there or in the current directory */
  51.  
  52. #define DRIVERPATH "C:\\TURBOC\\BGI"
  53.  
  54. long MaxXPos, MaxYPos;  /* physical screen size */
  55. int MaxColor;           /* maximum color index */
  56.  
  57. /*****************************************************/
  58.  
  59. /* convert relative point to absolute */
  60.  
  61. void abspoint(int *xpos, int *ypos) {
  62.  
  63.     if (*xpos <= 0)
  64.         *xpos = 0;
  65.     else if (*xpos >= 100)
  66.         *xpos = (int)MaxXPos;
  67.     else
  68.         *xpos = (int)(*xpos * MaxXPos / 100);
  69.  
  70.     if (*ypos <= 0)
  71.         *ypos = 0;
  72.     else if (*ypos >= 100)
  73.         *ypos = (int)MaxYPos;
  74.     else
  75.         *ypos = (int)(*ypos * MaxYPos / 100);
  76. }
  77.  
  78. /* convert relative rectangle to absolute */
  79.  
  80. static void absrect(int *lft, int *top,
  81.          int *rgt, int *bot) {
  82.  
  83.     int tmp;
  84.  
  85.     if (*lft > *rgt) {
  86.         tmp = *lft;  *lft = *rgt;  *rgt = tmp;
  87.     }
  88.     if (*top > *bot) {
  89.         tmp = *top;  *top = *bot;  *bot = tmp;
  90.     }
  91.     abspoint(lft, top);
  92.     abspoint(rgt, bot);
  93. }
  94.  
  95. /* init bitmapped graphics operations */
  96.  
  97. void grhopen(void) {
  98.  
  99.     int gdriver, gmode, gerror;
  100.  
  101.     gdriver = DETECT;
  102.     initgraph(&gdriver, &gmode, DRIVERPATH);
  103.     gerror = graphresult();
  104.     if (gerror < 0) {
  105.         printf("\ngraphics error:  %s.\n",
  106.              grapherrormsg(gerror));
  107.         exit(EXIT_FAILURE);
  108.     }
  109.  
  110.     MaxXPos = getmaxx();
  111.     MaxYPos = getmaxy();
  112.     MaxColor = getmaxcolor();
  113.  
  114.     setcolor(MaxColor);
  115.     setbkcolor(0);
  116. }
  117.  
  118. /* end bitmapped graphics operations */
  119.  
  120. void grhclose(void) {
  121.  
  122.     closegraph();
  123. }
  124.  
  125. /* draw sideways 'F' pair */
  126.  
  127. void grhfpair(int lft, int top, int rgt, int bot) {
  128.  
  129.     int dx, dy, dx2, dx3, dy3;
  130.  
  131.     setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH);
  132.     absrect(&lft, &top, &rgt, &bot);
  133.     dx = (rgt - lft + 1) / 7;
  134.     dy = (bot - top + 1) / 5;
  135.     dx2 = 2 * dx;  dx3 = 3 * dx;  dy3 = 3 * dy;
  136.     rectangle(lft, top, rgt, top + dy);
  137.     rectangle(lft, bot - dy, rgt, bot);
  138.     rectangle(rgt - dx, top + dy, rgt, top + dy3);
  139.     rectangle(lft, bot - dy3, lft + dx, bot - dy);
  140.     rectangle(lft + dx2, top + dy,
  141.          lft + dx3, top + dy3);
  142.     rectangle(rgt - dx3, bot - dy3,
  143.          rgt - dx2, bot - dy);
  144. }
  145.  
  146. /* draw rectangle */
  147.  
  148. void grhrect(int lft, int top, int rgt, int bot) {
  149.  
  150.     setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH);
  151.     absrect(&lft, &top, &rgt, &bot);
  152.     rectangle(lft, top, rgt, bot);
  153. }
  154.  
  155. /* draw circle */
  156.  
  157. void grhcircle(int lft, int top, int rgt, int bot) {
  158.  
  159.     int radius;
  160.  
  161.     setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH);
  162.     absrect(&lft, &top, &rgt, &bot);
  163.     radius = min((rgt - lft)/2, (bot - top)/2);
  164.     circle((lft + rgt)/2, (top + bot)/2, radius);
  165. }
  166.  
  167.